#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include "serialport.h"
#include "datahandler.h"
#include "sunposition.h"
#include "ruanzhuui.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    //void ceshi(const QByteArray &data);
    /**
     * @brief 处理连接按钮点击事件的槽函数。
     * 打开选中的串口并根据成功或失败显示消息。
     */
    void on_pushButton_connect_clicked();

    /**
     * @brief 处理关闭按钮点击事件的槽函数。
     * 关闭当前打开的串口并显示成功消息。
     */
    void on_pushButton_close_clicked();

    /**
     * @brief 处理刷新按钮点击事件的槽函数。
     * 刷新可用串口列表并更新下拉框。
     */
    void on_pushButton_Refresh_clicked();

    /**
     * @brief 发送握手信号命令按钮点击槽函数
     * 用于发送握手信号命令
     */
    void on_pushButton_handshake_clicked();

    /**
     * @brief 发送设备版本号查询命令按钮点击槽函数
     * 用于发送查询设备版本号的命令
     */
    void on_pushButton_version_clicked();

    /**
     * @brief 发送滤光片类型查询命令按钮点击槽函数
     * 用于发送查询滤光片类型的命令
     */
    void on_pushButton_filter_clicked();

    /**
     * @brief 发送启动自动测量数据命令按钮点击槽函数
     * 用于发送启动自动测量数据的命令
     */
    void on_pushButton_startMeasurement_clicked();

    /**
     * @brief 发送读取自动测量数据命令按钮点击槽函数
     * 用于发送读取自动测量数据的命令
     */
    void on_pushButton_readMeasurement_clicked();

    /**
     * @brief 数据处理完成后的槽函数
     * @param 接收到的数据
     */
    void onDataProcessed(const CommandResponse &responseData);

public slots:
    /**
     * @brief 自动开始采集，一分钟进行一次开始测量，获取数据
     */
    void Slots_autoObserve();


private:
    void initTimer();
    void initForm();

    /**
     * @brief checkSunPosition 检查当前太阳高度角是否大于5°
     * @return 如果当前太阳高度角是否大于5°返回true 否则返回false
     */
    bool checkSunPosition();

    Ui::Widget *ui;
    DataHandler *dataHandler;
    SerialPort *serialPort;
    QTimer* m_timer;
    double m_longtitude;//经度
    double m_latitude;//纬度
    ruanzhuUI* m_turnTable;
};

#endif // MAINWINDOW_H
